// @before-stub-for-debug-begin
#include "commonInc.h"
// @before-stub-for-debug-end


/*
 * @lc app=leetcode.cn id=73 lang=cpp
 *
 * [73] 矩阵置零
 */

// @lc code=start
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) 
    {
        if(matrix.empty() || matrix.front().empty())
            return;
        
        const int row=matrix.size(),col=matrix.front().size();
        //首列是否需要清零
        bool columnNeedClear=false;

        for(int i=0;i<row;++i)
        {
            if(matrix[i][0] == 0)
            {
                columnNeedClear=true;
                break;
            }
        }

        //使用首行首列作为标记数组
        for(int i=0;i<row;++i)
        {
            for(int j=1;j<col;++j)
            {
                if(matrix[i][j] == 0)
                {
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }
    
        //根据两个标记数组进行清0处理
        for(int i=1;i<row;++i)
        {
            if(matrix[i][0] == 0)
            {
                for(int j=1;j<col;++j)
                    matrix[i][j]=0;
            }
        }
        for(int j=1;j<col;++j)
        {
            if(matrix[0][j] == 0)
            {
                for(int i=1;i<row;++i)
                    matrix[i][j]=0;
            }
        }

        bool firstRowNeedClear = matrix[0][0] ==0;
        if(firstRowNeedClear)
        {
            for(int j=0;j<col;++j)
                matrix[0][j]=0;
        }
        if(columnNeedClear)
        {
            for(int i=0;i<row;++i)
                matrix[i][0]=0;
        }
    }
};
// @lc code=end

